package com.fdb.efp.nls.common;

import com.fdb.efp.nls.common.bo.UpLoadFileVO;
import com.sunyard.client2.Client;
import com.sunyard.ecm.server.bean.BaseBean;
import com.sunyard.ecm.server.bean.BatchBean;
import com.sunyard.ecm.server.bean.BatchFileBean;
import com.sunyard.ecm.server.bean.FileBean;
import com.sunyard.util.TransOptionKey;
import com.sunyard.ws.utils.XMLUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 影像平台
 * 
 * @author heyingfeng
 * @since 2019年1月14日 上午9:32:26
 * @version 1.0
 */
public class UploadFileConstant {

	private static Logger logger = LoggerFactory.getLogger(UploadFileConstant.class);

	private static String modelCode = FileDataConstant.MODEL_CODE;
	private static String startColumn = FileDataConstant.STARTCOLUMN;
	private static String filePartName = FileDataConstant.FILE_PART_NAME;
	private static String signFile = FileDataConstant.FILE_NATURE;
	private static String machineNum = "998427250DA34851907BA1917A43D223";

	public static BaseBean initial() {
		BaseBean baseBean = new BaseBean();
		baseBean.setMachineNum(machineNum);
		baseBean.setModelCode(modelCode);
		baseBean.setStartColumn(startColumn);
		baseBean.setFilePartName(filePartName);
		baseBean.setSignFile(signFile);
		return baseBean;
	}

	/**
	 * 上传
	 * 
	 * @param vo
	 *            业务流水号
	 * @param urlFile
	 *            文件路径
	 * @return 1.1: qiuyf:2019年3月29日 下午7:06:50: 新增客户证件号码参数<br>
	 * @author heyingfeng
	 * @since 2019年1月15日 上午11:35:55
	 * @date 2019年3月29日 下午7:06:50
	 * @version 1.1
	 */
	public static String uploadFile(UpLoadFileVO vo, String urlFile) {
		String ret = "";
		try {
			BaseBean baseBean = initial();
			/** 流水号 */
			baseBean.setApplySeq(vo.getApplySeq());
			baseBean.setBatchDate(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
			/** 流水号生成时候的日期 yyyymmdd */
			baseBean.setStartDate(vo.getStartDate());
			/** 证件号码 */
			baseBean.setCertCode(vo.getCertCode());
			/** 客户名称 */
			baseBean.setCusName(vo.getCusName());
			/** 产品名称 */
			baseBean.setPrdName(vo.getPrdName());
			/** 文件路径 */
			baseBean.setUrlFile(urlFile);
			// 上传文件
			ret = Client.uploadExample(baseBean);
			logger.info("#######上传流水号：" + vo.getApplySeq() + "#####返回信息#####" + ret + "#######");
//		} catch (Exception e) {
//			logger.error("#######上传异常#######" + e.getMessage());
//		}
//		return ret;
//	}
//
//	/**
//	 * 上传
//	 * 
//	 * @param urlFile
//	 *            文件路径
//	 * @param startDate
//	 *            索引属性参数(流水号生成时候的日期 yyyymmdd)
//	 * @return
//	 * @author heyingfeng
//	 * @since 2019年1月15日 上午11:35:55
//	 * @version 1.0
//	 */
//	public static String uploadFile(String applySeq, String urlFile, String startDate) {
//		String ret = "";
//		try {
//			BaseBean baseBean = initial();
//			baseBean.setApplySeq(applySeq);
//			baseBean.setBatchDate(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
//			baseBean.setUrlFile(urlFile);
//			baseBean.setStartDate(startDate);
//			/** 上传文件 */
//			ret = Client.uploadExample(baseBean);
//			logger.info("#######上传流水号：" + applySeq + "#####返回信息#####" + ret + "#######");
		} catch (Exception e) {
			logger.error("#######上传异常#######" + e.getMessage());
			e.printStackTrace();
		}
		return ret;
	}

	/**
	 * 查询批次
	 * 
	 * @param contentId
	 *            批次号
	 * @param dataFile
	 *            文件属性(查询单个不为空,值为cert_b-身份证正面等等)
	 * @param startDate
	 *            索引属性参数(流水号生成时候的日期 yyyymmdd)
	 * @return
	 * @author heyingfeng
	 * @since 2019年1月15日 上午11:36:41
	 * @version 1.0
	 */
	public static String queryBatchFile(String contentId, String startDate, String dataFile) {
		/** 查询 */
		String ret = "";
		try {
			BaseBean baseBean = initial();
			baseBean.setDataFile(dataFile);
			baseBean.setStartDate(startDate);
			baseBean.setContentId(contentId);
			ret = Client.queryExample(baseBean);// 查询单个则需要赋值dataFile
			logger.info("#######查询批次号：" + contentId + "#####返回信息#####" + ret + "#######");
		} catch (Exception e) {
			logger.error("#######查询异常#######" + e.getMessage());
			e.printStackTrace();
		}
		return ret;

	}

	/**
	 * 删除批次
	 * 
	 * @param contentId
	 *            批次号
	 * @param startDate
	 *            索引属性参数(流水号生成时候的日期 yyyymmdd)
	 * @return
	 * @author heyingfeng
	 * @since 2019年1月15日 上午11:38:14
	 * @version 1.0
	 */
	public static String deleteFile(String contentId, String startDate) {
		/** 删除 */
		String ret = "";
		try {
			BaseBean baseBean = initial();
			baseBean.setStartDate(startDate);
			baseBean.setContentId(contentId);
			ret = Client.deleteExample(baseBean);
			logger.info("#######删除批次号：" + contentId + "#####返回信息#####" + ret + "#######");
		} catch (Exception e) {
			logger.error("#######删除异常#######" + e.getMessage());
			e.printStackTrace();
		}
		return ret;
	}

	/**
	 * 更新批次追加文件
	 * 
	 * @param applySeq
	 * 		               业务流水号
	 * @param contentId
	 *            批次号
	 * @param urlFile
	 *            文件路径
	 * @param startDate
	 *            索引属性参数(流水号生成时候的日期 yyyymmdd)
	 * @return
	 * @author heyingfeng
	 * @since 2019年1月15日 上午11:39:16
	 * @version 1.0
	 */
	public static String updateBatchFile(String applySeq, String contentId, String urlFile, String startDate) {
		String ret = "";
		try {
			BaseBean baseBean = initial();
			baseBean.setBatchDate(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
			baseBean.setApplySeq(applySeq);
			baseBean.setUrlFile(urlFile);
			baseBean.setStartDate(startDate);
			baseBean.setContentId(contentId);
			// 更新一个批次追加文件
			ret = Client.updateExample(baseBean);
			logger.info("#######追加批次号：" + contentId + "#####返回信息#####" + ret + "#######");
		} catch (Exception e) {
			logger.error("#######追加文件异常#######" + e.getMessage());
			e.printStackTrace();
		}
		return ret;
	}

	/**
	 * 替换批次文件
	 * 
	 * @param contentId
	 *            批次号
	 * @param urlFile
	 *            文件路径
	 * @param imageType
	 *            文件标识
	 * @param startDate
	 *            索引属性参数(流水号生成时候的日期 yyyymmdd)
	 * @return
	 * @author heyingfeng
	 * @since 2019年1月15日 上午11:39:16
	 * @version 1.0
	 */
	public static String updateReplaceBatchFile(String resultMsg, String contentId, String urlFile, String startDate,
			String imageType) {
		String ret = "";
		try {
			BaseBean baseBean = initial();
			baseBean.setUrlFile(urlFile);
			baseBean.setStartDate(startDate);
			baseBean.setContentId(contentId);
			String batchStr = resultMsg.split(TransOptionKey.SPLITSYM)[1];
			List<BatchBean> batchBeans = XMLUtil.xml2list(XMLUtil.removeHeadRoot(batchStr), BatchBean.class);
			for (BatchBean batchBean : batchBeans) {
				List<BatchFileBean> fileBeans = batchBean.getDocument_Objects();
				for (BatchFileBean batchFileBean : fileBeans) {
					List<FileBean> files = batchFileBean.getFiles();
					for (FileBean fileBean : files) {
						String fileNo = fileBean.getFileNO();
						Map<String, String> attMap = fileBean.getOtherAtt();
						if (imageType != null && imageType.equals(attMap.get("LOAN_DATA"))) {
							// 替换批次文件
							ret = Client.updateReplaceExample(baseBean, fileNo);
							logger.info("#######替换批次号：" + contentId + "#####返回信息#####" + ret + "#######");
						}
					}
				}
			}
		} catch (Exception e) {
			logger.error("#######替换文件异常#######" + e.getMessage());
			e.printStackTrace();
		}
		return ret;
	}

	/**
	 * 更新或下载
	 * 
	 * @param resultMsg
	 *            查询返回报文(下载参数)
	 * @param contentId
	 *            批次号(更新参数)
	 * @param startDate
	 *            索引属性参数(流水号生成时候的日期 yyyymmdd)
	 * @param index
	 *            判断值(必输参数)
	 * @param urlFile
	 *            替换文件路径
	 * @param systemType
	 *            下载文件分类(各系统类别)(必输参数)
	 * @return
	 * @author heyingfeng
	 * @since 2019年1月15日 上午11:40:30
	 * @version 1.0
	 */
	public static String queryAndDownload(String resultMsg, String contentId, String startDate, String index,
			String urlFile, String systemType) {
		String ret = "";
		try {
			BaseBean baseBean = initial();
			baseBean.setUrlFile(urlFile);
			baseBean.setStartDate(startDate);
			baseBean.setContentId(contentId);
			String batchStr = resultMsg.split(TransOptionKey.SPLITSYM)[1];
			List<BatchBean> batchBeans = XMLUtil.xml2list(XMLUtil.removeHeadRoot(batchStr), BatchBean.class);
			for (BatchBean batchBean : batchBeans) {
				List<BatchFileBean> fileBeans = batchBean.getDocument_Objects();
				for (BatchFileBean batchFileBean : fileBeans) {
					List<FileBean> files = batchFileBean.getFiles();
					for (FileBean fileBean : files) {
						String urlStr = fileBean.getUrl();
						String fileName = fileBean.getFileNO() + "-" + Thread.currentThread().getId() + "."
								+ fileBean.getFileFormat();
						String fileNo = fileBean.getFileNO();
						if (UploadFileEnum.ImageDeal.DOWNLOAN.getValue().equals(index)) {// 下载
							logger.info("#######下载批次号：" + contentId + "#####文件访问链接为[" + urlStr + "], 文件名为[" + fileName
									+ "]#######");
							Client.receiveFileByURL(urlStr, systemType, fileName);
							ret = "#######文件下载成功#######";
							logger.info("#######文件下载成功#######");
						} else if (UploadFileEnum.ImageDeal.UPD_AND_DEL.getValue().equals(index)) {// 更新批次删除一个文件
							ret = Client.updateDelExample(baseBean, fileNo);
							logger.info("#######删除文件批次号成功：" + contentId);
						} else if (!UploadFileEnum.ImageDeal.UPD_AND_REP.getValue().equals(index)) {// 更新批次替换一个文件
							ret = Client.updateReplaceExample(baseBean, fileNo);
							logger.info("#######替换文件批次号成功：" + contentId);
						}
					}
				}
			}
		} catch (Exception e) {
			logger.error("#######异常#######" + e.getMessage());
			e.printStackTrace();
		}
		return ret;
	}

	/**
	 * 需求编号：2019D0519<br/>
	 * 问题编号：<br/>
	 * 功能描述：批量上传同一批次的所有文件<br/>
	 * 开发人员：周才顺<br/>
	 * 创建时间：2019年5月16日 下午7:53:24<br/>
	 * @author zhoucs1
	 * @since 1.0
	 * @version 1.0
	 * @param uploadFileList
	 * @return
	 * @throws Exception
	 */
	
//	public static String uploadListFile(List<UpLoadFileVO> uploadFileList) throws Exception {
//		// 获取返回结果
//		String rets = "";
//		BaseBean baseBean = initial();
//		if (uploadFileList == null || uploadFileList.isEmpty()) {
//			return "FAIL";
//		}
//		baseBean.setApplySeq(uploadFileList.get(0).getApplySeq());
//		// 设置批次时间
//		baseBean.setBatchDate(uploadFileList.get(0).getStartDate());
//		// 设置开始上传时间
//		baseBean.setStartDate(uploadFileList.get(0).getStartDate());
//		rets = Client.uploadListFiles(baseBean, uploadFileList);
//		return rets;
//	}
//
//	/**
//	 * 需求编号：2019D0519<br/>
//	 * 问题编号：<br/>
//	 * 功能描述：追加单个批次中的某个文件<br/>
//	 * 开发人员：周才顺<br/>
//	 * 创建时间：2019年5月16日 下午7:56:55<br/>
//	 * @author zhoucs1
//	 * @since 1.0
//	 * @version 1.0
//	 * @param upLoadFileVO
//	 * @return
//	 * @throws Exception
//	 */
//	public static String addSingleFile(UpLoadFileVO upLoadFileVO) throws Exception {
//		String ret = "";
//		if(upLoadFileVO == null) {
//			return "FAIL";
//		}
//		
//		BaseBean baseBean = initial();
//		baseBean.setBatchDate(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
//		baseBean.setApplySeq(upLoadFileVO.getApplySeq());
//		baseBean.setUrlFile(upLoadFileVO.getFilePath());
//		baseBean.setStartDate(upLoadFileVO.getStartDate());
//		baseBean.setContentId(upLoadFileVO.getBatch());
//		// 更新一个批次追加文件
//		ret = Client.updateSingleFile(baseBean, upLoadFileVO);
//		logger.info("#######追加批次号：" + upLoadFileVO.getBatch() + "#####返回信息#####" + ret + "#######");
//
//		return ret;
//	}
//
//	/**
//	 * 需求编号：2019D0519<br/>
//	 * 问题编号：<br/>
//	 * 功能描述：替换单个批次中一个文件<br/>
//	 * 开发人员：周才顺<br/>
//	 * 创建时间：2019年5月16日 下午7:57:30<br/>
//	 * @author zhoucs1
//	 * @since 1.0
//	 * @version 1.0
//	 * @param upLoadFileVO
//	 * @return
//	 * @throws Exception
//	 */
//	public static String replaceSingleFile(UpLoadFileVO upLoadFileVO) throws Exception {
//		String ret = "";
//		// 如果传进来的参数为空,则返回失败
//		if (upLoadFileVO == null) {
//			return "FAIL";
//		}
//
//		String filePath = upLoadFileVO.getFilePath();
//		String startDate = upLoadFileVO.getStartDate();
//		String batch = upLoadFileVO.getBatch();
//		String imageType = upLoadFileVO.getImageType();
//		BaseBean baseBean = initial();
//		baseBean.setUrlFile(filePath); // 文件路径
//		baseBean.setStartDate(startDate); // 批次日期
//		baseBean.setContentId(batch); // 批次号
//		List<BatchBean> batchBeans = XMLUtil.xml2list(XMLUtil.removeHeadRoot(batch), BatchBean.class);
//		for (BatchBean batchBean : batchBeans) {
//			List<BatchFileBean> fileBeans = batchBean.getDocument_Objects();
//			for (BatchFileBean batchFileBean : fileBeans) {
//				List<FileBean> files = batchFileBean.getFiles();
//				for (FileBean fileBean : files) {
//					String fileNo = fileBean.getFileNO(); // 获取文件号
//					if (imageType != null) {
//						// 替换批次文件
//						ret = Client.updateReplaceExample(baseBean, fileNo);
//						logger.info("#######替换批次号：" + batch + "#####返回信息#####" + ret + "#######");
//					}
//				}
//			}
//		}
//		return ret;
//	}
//
//
	/**
	 * 向影像系统下载文影像文件
	 * @param upLoadFileVO
	 * @param dirName 存放的文件夹名称（基于配置downfile路径后）
	 * @return 返回下载的文件路径
	 */
	public static String downFileFromImageSys(UpLoadFileVO upLoadFileVO,String dirName) throws Exception {

		String queryMsg = UploadFileConstant.queryBatchFile(upLoadFileVO.getBatch(), upLoadFileVO.getStartDate(), upLoadFileVO.getImageType());
		if (StringUtils.isEmpty(queryMsg)) {
			throw new Exception("从影像系统获取数据异常，请稍后再试");
		}
		String batchStr = queryMsg.split(TransOptionKey.SPLITSYM)[1];
		List<BatchBean> batchBeans = XMLUtil.xml2list(XMLUtil.removeHeadRoot(batchStr), BatchBean.class);
		for (BatchBean batchBean : batchBeans) {
			List<BatchFileBean> fileBeans = batchBean.getDocument_Objects();
			for (BatchFileBean batchFileBean : fileBeans) {
				List<FileBean> files = batchFileBean.getFiles();
				for (FileBean fileBean : files) {
					String urlStr = fileBean.getUrl();
					logger.info("从影像系统下载文件获取到的影像连接路径：{}", urlStr);
					//为了测试将urlStr抓换ip未虚拟机的ip
					//urlStr=urlStr.replaceAll("10.1.122.92","10.139.2.50");
					String fileName = fileBean.getFileNO() + "-" + Thread.currentThread().getId() + "."
							+ fileBean.getFileFormat();
					Client.downLoanFile(urlStr, dirName+"/"+fileName);
					return Client.downFile+dirName+"/"+fileName;
				}
			}
		}
		return null;

	}
}
